package cn.collection.treeset;

import java.util.TreeSet;

public class Demo02 {
    /*
    *案例需求
        存储学生对象并遍历，创建TreeSet集合使用无参构造方法
        要求：按照年龄从小到大排序，年龄相同时，按照姓名的字母顺序排序
    * */
    public static void main(String[] args) {
        /*
        3.5两种比较方式总结【理解】
            两种比较方式小结
                自然排序: 自定义类实现Comparable接口,重写compareTo方法,根据返回值进行排序
                比较器排序: 创建TreeSet对象的时候传递Comparator的实现类对象,重写compare方法,根据返回值进行排序
                在使用的时候,默认使用自然排序,当自然排序不满足现在的需求时,必须使用比较器排序
            两种方式中关于返回值的规则
                如果返回值为负数，表示当前存入的元素是较小值，存左边
                如果返回值为0，表示当前存入的元素跟集合中元素重复了，不存
                如果返回值为正数，表示当前存入的元素是较大值，存右边
        * */
        test01();
        System.out.println();
        test02();
    }

    public static void test02() {
        TreeSet<Student> ts = new TreeSet<>((s1,s2)->{
           int result = s2.getAge() - s1.getAge();
           return result == 0 ? s2.getName().compareTo(s1.getName()) : result;
        });
        //创建学生对象
        Student s1 = new Student("zhangsan",28);
        Student s2 = new Student("lisi",27);
        Student s3 = new Student("wangwu",29);
        Student s4 = new Student("zhaoliu",28);
        Student s5 = new Student("qianqi",30);
        //把学生添加到集合
        ts.add(s1);
        ts.add(s2);
        ts.add(s3);
        ts.add(s4);
        ts.add(s5);

        ts.forEach(System.out::println);
    }

    public static void test01() {
        //创建集合对象
        TreeSet<Student> ts = new TreeSet<>();
        //创建学生对象
        Student s1 = new Student("zhangsan",28);
        Student s2 = new Student("lisi",27);
        Student s3 = new Student("wangwu",29);
        Student s4 = new Student("zhaoliu",28);
        Student s5 = new Student("qianqi",30);
        //把学生添加到集合
        ts.add(s1);
        ts.add(s2);
        ts.add(s3);
        ts.add(s4);
        ts.add(s5);
        //遍历集合
        ts.forEach(System.out::println);
    }
}
